/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package maincz.tests.webapp.utils;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import maincz.tests.webapp.entity.Cache;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 *
 * @author Main
 */
public class CacheUtil {
    /**
     * Rozparsuje stranku s kesi a vrati novy objekt.
     * @param url Url stranky s kesi.
     * @return objekt kese.
     */
    public static Cache parseCachePage(String url) {
        Cache cache = new Cache();

        try {                    
            Document doc = Jsoup.connect(url).get();
            
            cache.setGeocode(getGeocode(doc));            
            cache.setUrl(url);
            cache.setDifficulty(getDifficulty(doc));
            cache.setTerrain(getTerrain(doc));
            
        } catch (IOException ex) {
            return null;
        }
        return cache;
    }
    
    /**
     * Zpracovani jedne stranky s vysledky vyhledavani kesi
     * @param url url stranky
     */
    public static void parseSearchPage(Document doc, NewCacheProcessor processor) {

        // ziskani elementu table s vysledky
        Element resultTable = doc.getElementsByClass("SearchResultsTable").first();
        // vytazeni radku
        Elements rows = resultTable.getElementsByTag("tr");

        // prochazeni radku
        for (Element row: rows) {   
            // jenom radky s daty
            if (row.hasClass("Data")) {
                // v td s touhle tridou je vsecko, co je potreba
                Element dataTd = row.getElementsByClass("Merge").first();
                // link na kes
                String cachLink = dataTd.getElementsByTag("a").first().attr("abs:href");
                // stazeni a rozparsovani stranky s kesi
                Cache newCache = CacheUtil.parseCachePage(cachLink);
                // zpracovani nove nactene kese
                processor.processCache(newCache);
            }
        }     

    }
    
    /**
     * Vytahne z domu geocode
     * @param doc document
     * @return geocode
     */
    private static String getGeocode(Document doc) {    
        Elements coordInfo = doc.getElementsByClass("CoordInfoCode");
        if (!coordInfo.isEmpty()) {
            return coordInfo.first().text();
        }
        return null;
    }
    
    /**
     * Vytahne z domu obtiznost kese
     * @param doc document
     * @return difficulty
     */
    private static Double getDifficulty(Document doc) {
        Elements els = doc.getElementsByClass("CacheStarImgs");
        if (els == null || els.isEmpty()) { return null; }
        
        els = els.first().getElementsByTag("span");
        if (els == null || els.isEmpty()) { return null; }
        
        els = els.get(0).getElementsByTag("img");
        if (els == null || els.isEmpty()) { return null; }
        
        String str = els.get(0).attr("alt");
        return Double.parseDouble(str.substring(0, str.indexOf(" out")));
    }
    
    /**
     * Vytahne z domu obtiznost terenu
     * @param doc document
     * @return terrain
     */
    private static Double getTerrain(Document doc) {
        Elements els = doc.getElementsByClass("CacheStarImgs");
        if (els == null || els.isEmpty()) { return null; }
        
        els = els.first().getElementsByTag("span");
        if (els == null || els.isEmpty()) { return null; }
        
        els = els.get(1).getElementsByTag("img");
        if (els == null || els.isEmpty()) { return null; }
        
        String str = els.get(0).attr("alt");
        return Double.parseDouble(str.substring(0, str.indexOf(" out")));    
    }
}
